﻿using System;
using System.Runtime.InteropServices;

namespace ConsoleApp
{
    /*
     * 给出两个 非空 的链表用来表示两个非负的整数。
     * 其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
       如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
       您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
       示例：
       输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
       输出：7 -> 0 -> 8
       原因：342 + 465 = 807
     */
    public class ListNode
    {
        public int val;
        public ListNode next;
        public ListNode(int x)
        {
            val = x;
        }

        public static ListNode Parse(int value)
        {
            ListNode ln0 = new ListNode(value % 10);
            ListNode ln = ln0;
            value = value / 10;
            while (value != 0)
            {
                ln.next = new ListNode(value % 10);
                ln = ln.next;
                value = value / 10;
            }

            return ln0;
        }

        public void Print()
        {
            ListNode ln = this;
            Console.Write(ln.val);
            while (ln.next != null)
            {
                Console.Write("->");
                ln = ln.next;
                Console.Write(ln.val);
            }
            Console.WriteLine();
        }
    }
    class Action002_链表整数加法
    {

        public void Test()
        {
            ListNode l1 = ListNode.Parse(99);
            l1.Print();
            ListNode l2 = new ListNode(1);
            l2.Print();

            AddTwoNumbers(l1, l2).Print();

        }
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            if (l1 == null)
            {
                throw new ArgumentNullException();
            }

            if (l2 == null)
            {
                throw new ArgumentNullException();
            }

            ListNode ln = new ListNode(0);
            ListNode lnCur = ln;
            bool first = true;
            //进位
            bool add = false;
            while (l1 != null || l2 != null || add)
            {
                if (!first)
                {
                    lnCur.next = new ListNode(0);
                    lnCur = lnCur.next;
                    first = false;
                }

                //任意链上有数值或有进位
                int sum = 0;
                if (l1 != null)
                {
                    sum += l1.val;
                    l1 = l1.next;
                }

                if (l2 != null)
                {
                    sum += l2.val;
                    l2 = l2.next;
                }

                if (add)
                {
                    sum++;
                }

                if (sum>=10)
                {
                    sum -= 10;
                    add = true;
                }
                else
                {
                    add = false;
                }

                lnCur.val = sum;
                first = false;
            }

            return ln;
        }
    }
}
